package salesport.presentacion;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import salesport.bean.DetallePedidoDTO;
import salesport.bean.PedidoDTO;
import salesport.bean.ProductoDTO;
import salesport.negocio.CUBuscarProducto_I;
import salesport.negocio.CUGenerarPedido_I;
import salesport.negocio.PaqueteBusinessDelegate;

import com.opensymphony.xwork2.ActionSupport;

public class PedidoAction extends ActionSupport implements ServletRequestAware, ServletResponseAware
{
    private static final long serialVersionUID = 809122283945555824L;

    HttpServletRequest request = null;

    HttpServletResponse response = null;

    private PedidoDTO pedidoDTO = new PedidoDTO();

    private List<ProductoDTO> listadoProductos = null;

    public String personalizar()
    {
        String[] productos = this.request.getParameterValues("productos");
        for (String codigoProducto : productos)
        {
            agregarACarrito(codigoProducto);
        }

        return "carrito";
    }

    public String agregar()
    {
        String codigoProducto = this.request.getParameter("prod");
        agregarACarrito(codigoProducto);

        return "carrito";
    }

    @Override
    public void setServletRequest(HttpServletRequest httpServletRequest)
    {
        this.request = httpServletRequest;
    }

    private void agregarACarrito(String codigoProducto)
    {
        HttpSession session = this.request.getSession(false);
        this.pedidoDTO = (PedidoDTO) session.getAttribute("carrito");

        if (this.pedidoDTO == null)
        {
            this.pedidoDTO = new PedidoDTO();
        }

        if (!existeEnPedido(codigoProducto))
        {
            pedidoDTO.getDetallePedidoDTO().add(recuperarInformacionProducto(codigoProducto));

            session.setAttribute("carrito", pedidoDTO);
        }
    }

    private boolean existeEnPedido(String codigoProducto)
    {
        if (StringUtils.isBlank(codigoProducto) || pedidoDTO == null || pedidoDTO.getDetallePedidoDTO() == null
                || pedidoDTO.getDetallePedidoDTO().size() <= 0)
        {
            return false;
        }

        for (DetallePedidoDTO det : pedidoDTO.getDetallePedidoDTO())
        {
            if (det.getCodigo().equals(codigoProducto))
            {
                return true;
            }
        }
        return false;
    }

    private DetallePedidoDTO recuperarInformacionProducto(String codigoProducto)
    {
        DetallePedidoDTO detallePedidoDTO = null;
        try
        {
            if (this.listadoProductos == null || this.listadoProductos.size() <= 0)
            {
                CUBuscarProducto_I service_I = PaqueteBusinessDelegate.getMantenerProducto();
                this.listadoProductos = service_I.buscarXCriterio(null);
            }
            for (ProductoDTO deDto : this.listadoProductos)
            {
                if (deDto.getCodigo().equals(codigoProducto))
                {
                    detallePedidoDTO = new DetallePedidoDTO();
                    BeanUtils.copyProperties(detallePedidoDTO, deDto);
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return detallePedidoDTO;
    }
    
    public String generar() 
	{
		HttpSession session = this.request.getSession(false);
		this.pedidoDTO = (PedidoDTO) session.getAttribute("carrito");
		
		if (this.pedidoDTO != null
				&& this.pedidoDTO.getDetallePedidoDTO() != null
				&& this.pedidoDTO.getDetallePedidoDTO().size() > 0)
		{
			for(int j = 0; j < this.pedidoDTO.getDetallePedidoDTO().size(); j++)
			{
				String cantidad = this.request.getParameter(
						this.pedidoDTO.getDetallePedidoDTO().get(j).getCodigo());
				
				this.pedidoDTO.getDetallePedidoDTO().get(j).setCantidad(Integer.parseInt(cantidad));
			}
		}

		CUGenerarPedido_I service_I = PaqueteBusinessDelegate.getMantenerPedido();
		try 
		{
			service_I.registrar(this.pedidoDTO);
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
			return "error";
		}
		return "pagar";
	}

    @Override
    public void setServletResponse(HttpServletResponse httpServletResponse)
    {
        this.response = httpServletResponse;
    }
}
